// ==UserScript==
// @name         百度网盘自动分享+截图工具
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  一键全选文件、创建分享链接、保存链接文本并自动截图
// @author       您的名字
// @match        *://*.baidu.com/*
// @grant        GM_setClipboard
// @grant        GM_xmlhttpRequest
// @grant        GM_download
// @grant        unsafeWindow
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';

    // 加载html2canvas库
    async function loadHtml2Canvas() {
        if (!unsafeWindow.html2canvas) {
            return new Promise((resolve, reject) => {
                GM_xmlhttpRequest({
                    method: 'GET',
                    url: 'https://html2canvas.hertzen.com/dist/html2canvas.min.js',
                    onload: function(response) {
                        const script = document.createElement('script');
                        script.textContent = response.responseText;
                        document.head.appendChild(script);
                        setTimeout(() => resolve(), 500);
                    },
                    onerror: function(error) {
                        reject(error);
                    }
                });
            });
        }
    }

    // 从URL获取文件名
    function getFileNameFromURL() {
        // 获取当前URL
        const url = window.location.href;

        // 检查是否包含path参数
        if (url.includes('path=')) {
            try {
                // 提取path参数值
                const pathMatch = url.match(/path=([^&#+]*)/);
                if (pathMatch && pathMatch[1]) {
                    const encodedPath = pathMatch[1];

                    // 解码URL编码的路径
                    const decodedPath = decodeURIComponent(encodedPath);

                    // 按照/分割路径并获取最后一段
                    const pathSegments = decodedPath.split('/').filter(Boolean);
                    if (pathSegments.length > 0) {
                        return pathSegments[pathSegments.length - 1];
                    }
                }
            } catch (e) {
                console.error('解析URL路径失败:', e);
            }
        }

        // 如果无法从path参数获取，返回默认名称
        return `百度网盘文件_${Date.now()}`;
    }

    // 等待元素出现
    function waitForElement(selector, timeout = 10000) {
        return new Promise((resolve, reject) => {
            if (document.querySelector(selector)) {
                return resolve(document.querySelector(selector));
            }

            const observer = new MutationObserver(mutations => {
                if (document.querySelector(selector)) {
                    observer.disconnect();
                    resolve(document.querySelector(selector));
                }
            });

            observer.observe(document.body, {
                childList: true,
                subtree: true
            });

            // 设置超时
            setTimeout(() => {
                observer.disconnect();
                reject(new Error(`等待元素 ${selector} 超时`));
            }, timeout);
        });
    }

    // 模拟点击元素
    function simulateClick(element) {
        if (!element) return false;

        try {
            // 创建点击事件
            const clickEvent = new MouseEvent('click', {
                view: unsafeWindow,
                bubbles: true,
                cancelable: true
            });

            // 分发事件
            element.dispatchEvent(clickEvent);
            return true;
        } catch (e) {
            console.error('模拟点击失败:', e);
            return false;
        }
    }

    // 保存文本到文件
    function saveTextToFile(text, fileName) {
        const blob = new Blob([text], { type: 'text/plain;charset=utf-8' });
        const url = URL.createObjectURL(blob);

        const link = document.createElement('a');
        link.href = url;
        link.download = fileName;
        link.style.display = 'none';

        document.body.appendChild(link);
        link.click();

        setTimeout(() => {
            document.body.removeChild(link);
            URL.revokeObjectURL(url);
        }, 100);
    }

    // 获取剪贴板内容
    async function getClipboardContent() {
        try {
            // 尝试使用现代API
            if (navigator.clipboard && navigator.clipboard.readText) {
                return await navigator.clipboard.readText();
            }

            // 备用方法：创建文本区域并执行粘贴
            const textarea = document.createElement('textarea');
            textarea.style.position = 'fixed';
            textarea.style.left = '-9999px';
            textarea.style.top = '-9999px';
            document.body.appendChild(textarea);
            textarea.focus();

            document.execCommand('paste');
            const text = textarea.value;

            document.body.removeChild(textarea);
            return text;
        } catch (e) {
            console.error('获取剪贴板内容失败:', e);
            return '';
        }
    }

    // 截图功能
    async function takeScreenshot() {
        try {
            // 加载html2canvas
            await loadHtml2Canvas();

            // 尝试多个可能的选择器
            const possibleSelectors = [
                'div.wp-s-file-list__list-content',
                'div.wp-s-pan-table__body',
                'div.wp-s-file-contain-list__body',
                'div.file-list-wrapper',
                '.file-list',
                '.wp-s-pan-file-list__list-wrapper'
            ];

            let targetElement = null;

            // 尝试找到正确的元素
            for (const selector of possibleSelectors) {
                const element = document.querySelector(selector);
                if (element) {
                    console.log(`找到元素: ${selector}`);
                    targetElement = element;
                    break;
                }
            }

            if (!targetElement) {
                // 如果找不到特定元素，尝试截取整个主内容区域
                targetElement = document.querySelector('main') ||
                               document.querySelector('.nd-main-layout') ||
                               document.querySelector('.nd-main-list') ||
                               document.querySelector('.wp-s-pan-main');

                if (!targetElement) {
                    alert('无法找到文件列表元素，将截取整个页面');
                    targetElement = document.body;
                }
            }

            console.log('找到目标元素:', targetElement);

            // 获取目标元素的原始高度
            const originalHeight = targetElement.scrollHeight;
            console.log(`目标元素高度: ${originalHeight}px`);

            // 创建一个临时克隆，避免修改原始DOM
            const tempContainer = document.createElement('div');
            tempContainer.style.position = 'absolute';
            tempContainer.style.left = '-9999px';
            tempContainer.style.top = '-9999px';
            tempContainer.style.width = `${targetElement.clientWidth}px`;
            document.body.appendChild(tempContainer);

            // 克隆目标元素到临时容器
            const clonedElement = targetElement.cloneNode(true);

            // 确保克隆元素显示完整内容
            clonedElement.style.height = 'auto';
            clonedElement.style.maxHeight = 'none';
            clonedElement.style.overflow = 'visible';
            clonedElement.style.position = 'static';

            // 添加到临时容器
            tempContainer.appendChild(clonedElement);

            // 等待一小段时间确保DOM更新
            await new Promise(resolve => setTimeout(resolve, 500));

            // 执行截图
            console.log('开始截图...');
            const canvas = await unsafeWindow.html2canvas(clonedElement, {
                backgroundColor: '#ffffff',  // 白色背景
                useCORS: true,          // 允许跨域图片
                allowTaint: true,       // 允许污染
                scale: 2,               // 提高分辨率
                logging: true,          // 开启日志以便调试
                removeContainer: false,  // 不移除临时容器
                width: targetElement.clientWidth,
                height: Math.max(originalHeight, clonedElement.scrollHeight),
                windowWidth: document.documentElement.offsetWidth,
                windowHeight: document.documentElement.offsetHeight,
                foreignObjectRendering: false  // 禁用foreignObject渲染以提高兼容性
            });

            // 清理临时元素
            document.body.removeChild(tempContainer);

            // 保存原始尺寸的图片
            const imgData = canvas.toDataURL('image/png');

            // 从URL获取文件名
            const folderName = getFileNameFromURL();
            // 生成文件名，确保没有非法字符
            const fileName = `${folderName.replace(/[\\/:*?"<>|]/g, '_')}.png`;

            // 使用saveAs: true提示用户选择保存位置
            GM_download({
                url: imgData,
                name: fileName,
                saveAs: true  // 提示用户选择保存位置
            });

            console.log('截图已完成，文件名:', fileName);
        } catch (error) {
            console.error('截图失败:', error);
            alert('截图失败: ' + error.message);
        }
    }

    // 主流程：全选、分享、保存链接、截图
    async function autoShareAndScreenshot() {
        try {
            console.log('开始自动分享流程...');

            // 1. 等待并点击全选按钮
            console.log('等待全选按钮...');
            const selectAllCheckbox = await waitForElement('label.u-checkbox.wp-s-file-contain-list__select-all');
            console.log('找到全选按钮，点击...');
            simulateClick(selectAllCheckbox);

            // 等待选择状态更新
            await new Promise(resolve => setTimeout(resolve, 500));

            // 2. 等待并点击分享按钮
            console.log('等待分享按钮...');
            const shareButton = await waitForElement('button.u-button.wp-s-agile-tool-bar__h-action-button.u-button--text.u-button--small');
            console.log('找到分享按钮，点击...');
            simulateClick(shareButton);

            // 等待分享对话框出现
            await new Promise(resolve => setTimeout(resolve, 1000));

            // 3. 等待并点击创建链接按钮
            console.log('等待创建链接按钮...');
            const createLinkButton = await waitForElement('button.u-button.wp-share-file__link-create-ubtn.nd-btn-fix-size-middle.u-button--primary.u-button--medium.is-round.u-popover__reference');
            console.log('找到创建链接按钮，点击...');
            simulateClick(createLinkButton);

            // 4. 等待2秒，确保链接已复制到剪贴板
            console.log('等待链接生成并复制到剪贴板...');
            await new Promise(resolve => setTimeout(resolve, 2000));

            // 5. 获取剪贴板内容
            const clipboardContent = await getClipboardContent();
            console.log('获取到剪贴板内容:', clipboardContent);

            let shareInfo = '';

            // 6. 检查是否是百度网盘分享链接
            if (clipboardContent && (clipboardContent.includes('pan.baidu.com') ||
                                     clipboardContent.includes('链接:') ||
                                     clipboardContent.includes('提取码:'))) {

                shareInfo = clipboardContent;
            } else {
                // 如果没有获取到有效的分享链接，尝试查找分享对话框中的链接文本
                console.log('从剪贴板未获取到有效链接，尝试从页面元素获取...');

                // 尝试从页面元素中获取链接
                const linkElement = await waitForElement('.wp-share-file__link-url-input input');
                const codeElement = document.querySelector('.wp-share-file__link-pwd-input input');

                if (linkElement) {
                    shareInfo = `链接: ${linkElement.value}`;
                    if (codeElement && codeElement.value) {
                        shareInfo += `\n提取码: ${codeElement.value}`;
                    }
                } else {
                    throw new Error('无法获取分享链接，请手动复制');
                }
            }

            // 7. 保存分享链接到文本文件
            if (shareInfo) {
                // 获取文件名
                const fileName = `${getFileNameFromURL()}_分享链接.txt`;

                // 保存到文件
                saveTextToFile(shareInfo, fileName);

                console.log('分享链接已保存到文件:', fileName);

                // 8. 关闭分享对话框
                try {
                    const closeButton = document.querySelector('.u-dialog__headerbtn') ||
                                        document.querySelector('.wp-dialog-close') ||
                                        document.querySelector('.wp-share-file__dialog .u-icon-close');
                    if (closeButton) {
                        console.log('关闭分享对话框...');
                        simulateClick(closeButton);

                        // 等待对话框关闭
                        await new Promise(resolve => setTimeout(resolve, 1000));
                    }
                } catch (e) {
                    console.error('关闭对话框失败:', e);
                }

                // 9. 执行截图功能
                console.log('准备执行截图...');
                await takeScreenshot();

                console.log('全部操作已完成');
            }

        } catch (error) {
            console.error('自动分享过程出错:', error);
            alert(`自动分享失败: ${error.message}`);
        }
    }

    // 创建触发按钮
    function createTriggerButton() {
        const button = document.createElement('button');
        button.textContent = '一键分享+截图';
        button.style.position = 'fixed';
        button.style.top = '10px';
        button.style.right = '10px';
        button.style.zIndex = '9999';
        button.style.padding = '8px 12px';
        button.style.backgroundColor = '#2d78f4';
        button.style.color = 'white';
        button.style.border = 'none';
        button.style.borderRadius = '4px';
        button.style.cursor = 'pointer';
        button.style.fontWeight = 'bold';

        button.addEventListener('click', () => {
            autoShareAndScreenshot();
        });

        document.body.appendChild(button);
    }

    // 添加快捷键支持：Ctrl+Shift+S
    document.addEventListener('keydown', function(e) {
        if (e.ctrlKey && e.shiftKey && e.key === 'S') {
            e.preventDefault();
            e.stopPropagation();
            console.log('触发分享+截图快捷键');
            autoShareAndScreenshot();
            return false;
        }
    }, true);

    // 初始化：预加载html2canvas库并创建触发按钮
    loadHtml2Canvas().then(() => {
        console.log('html2canvas库已加载');
        createTriggerButton();
    }).catch(err => {
        console.error('html2canvas加载失败:', err);
        createTriggerButton();  // 即使加载失败也创建按钮
    });

    console.log('百度网盘自动分享+截图工具已加载，可以使用Ctrl+Shift+S快捷键或点击右上角按钮');
})();